<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Set方法详细使用说明</title>
  <!-- 
  在 JavaScript 中， `Set`  和  `Map`  是两种重要的数据结构，它们在 ES6 中被引入，用于存储和管理数据。
  一、Set
   1. 定义
  `Set`  是一种集合，它允许存储唯一的值（即不允许重复）。可以存储任何类型的值，包括原始值和对象引用。

   2. 创建 Set
  使用  `new Set()`  创建一个新的 Set 实例。
  const mySet = new Set();
   3. 添加元素
  使用  `add(value)`  方法向 Set 中添加元素。
  mySet.add(1);
  mySet.add(2);
  mySet.add(2); // 不会添加重复的值
  console.log(mySet); // 输出: Set { 1, 2 }
   4. 删除元素
  使用  `delete(value)`  方法删除 Set 中的元素。
  mySet.delete(1);
  console.log(mySet); // 输出: Set { 2 }
   5. 检查元素
  使用  `has(value)`  方法检查 Set 中是否存在某个值。
  console.log(mySet.has(2)); // 输出: true
  console.log(mySet.has(1)); // 输出: false
   6. 清空 Set
  使用  `clear()`  方法清空 Set 中的所有元素。
  mySet.clear();
  console.log(mySet); // 输出: Set {}
   7. Set 的迭代
  Set 是可迭代的，可以使用  `for...of`  循环进行迭代。
  mySet.add(1);
  mySet.add(2);
  mySet.add(3);

  for (const value of mySet) {
      console.log(value); // 输出: 1, 2, 3
  }
   8. Set 的大小
  使用  `size`  属性获取 Set 中元素的数量。
  console.log(mySet.size); // 输出: 3

  总结
  - Set 是一个集合，存储唯一的值，适合用于需要去重的场景。
  - Map 是一个键值对集合，允许使用任何类型的值作为键，适合用于需要快速查找的场景。
  - 两者都支持迭代，可以方便地遍历元素。
  -  `Set`  和  `Map`  都具有  `size`  属性来获取元素数量，并提供了简单易用的方法来添加、删除和检查元素。
  -->
</head>
<body>

  <script>
    // 1. 创建Set
    const set = new Set();
    console.log(set);
    
    // 2. 添加元素
    set.add(1);
    set.add(2);
    set.add(3);
    console.log(set);

    const arr = [1, 2, 3, 4, 5];
    const obj = { a: 1, b: 2, c: 3 };
    set.add(arr);
    set.add(obj);
    console.log(set);

    // 2.2 获取set值
    console.log(set.values());
    console.log(set.keys());
    console.log(set.entries());

    // 3. 删除元素
    set.delete(2);
    console.log(set);

    // 4. 检查元素
    console.log(set.has(1)); // 输出: true
    console.log(set.has(2)); // 输出: false

    // 5. 清空Set
    set.clear();
    console.log(set);

    // 6. Set的迭代
    const mySet = new Set([1, 2, 3, 4, 5]);
    for (const value of mySet) {
        console.log(value); // 输出: 1 2 3 4 5
    }

    // 7. Set的转换
    const mySet2 = new Set([1, 2, 3, 4, 5]);
    const myArray = [...mySet2];
    console.log(myArray); // 输出: [1, 2, 3, 4, 5]

    // 8. Set的交集、并集、差集
    const setA = new Set([1, 2, 3]);
    const setB = new Set([2, 3, 4]);
    // 交集
    const intersection = new Set([...setA].filter(x => setB.has(x))); // 输出: Set { 2, 3 }
    console.log(intersection);

    // 并集
    const union = new Set([...setA, ...setB]); // 输出: Set { 1, 2, 3, 4 }
    console.log(union);

    // 差集
    const difference = new Set([...setA].filter(x => !setB.has(x))); // 输出: Set { 1 }
    console.log(difference);

    // 9. 数组去重
    const myArray2 = [1, 2, 2, 3, 4, 4, 5];
    const uniqueArray = [...new Set(myArray2)];
    console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

  </script>
  
</body>
</html>